﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using AgenciaViajeServices.Persistencia;
using AgenciaViajeServices.Dominio;

namespace AgenciaViajeServices
{
    public class Autorizaciones : IAutorizaciones
    {
        private AutorizacionDAO autorizacionDAO = null;
        private AutorizacionDAO AutorizacionDAO
        {
            get
            {
                if (autorizacionDAO == null)
                    autorizacionDAO = new AutorizacionDAO();
                return autorizacionDAO;
            }
        }

        private UsuarioDAO usuarioDAO = null;
        private UsuarioDAO UsuarioDAO
        {
            get
            {
                if (usuarioDAO == null)
                    usuarioDAO = new UsuarioDAO();
                return usuarioDAO;
            }
        }

        public Autorizacion ObtenerAutorizacion(int codigo)
        {
            return AutorizacionDAO.Obtener(codigo);
        }

        public Autorizacion CrearAutorizacion(int codsol, int codarea, string codsolge, string ccost, string dni, int perviajan, string ruta, string fdes, string fhas, string motivo, string moneda, double hotel, double viaticos, double movi, double tele, double gasto, double impaereo, double pasaje, double combus, double otros)
        {
            int number1 = 0;
            double number2 = 0.0;
            bool canConvert = int.TryParse(dni, out number1);
            bool canConvert1 = double.TryParse(hotel.ToString(), out number2);
            bool canConvert2 = double.TryParse(viaticos.ToString(), out number2);
            bool canConvert3 = double.TryParse(movi.ToString(), out number2);
            bool canConvert4 = double.TryParse(tele.ToString(), out number2);
            bool canConvert5 = double.TryParse(gasto.ToString(), out number2);
            bool canConvert6 = double.TryParse(impaereo.ToString(), out number2);
            bool canConvert7 = double.TryParse(pasaje.ToString(), out number2);
            bool canConvert8 = double.TryParse(combus.ToString(), out number2);
            bool canConvert9 = double.TryParse(otros.ToString(), out number2);

            Usuario usu = new Usuario();
            usu = UsuarioDAO.Buscar(codsolge);
            if (usu == null)
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Usuario no Existe" }, new FaultReason("Usuario no Existe"));
            }
            else if (usu.Status == "VACACIONES")
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Usuario de Vacaciones" }, new FaultReason("Usuario de Vacaciones"));
            }
            else if (usu.Status == "BLOQUEADO")
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Usuario Bloqueado" }, new FaultReason("Usuario Bloqueado"));
            }



            if (canConvert != true)
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "DNI NO Valido" }, new FaultReason("DNI NO Valido"));
            }
            if (dni.Length != 8 )
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "DNI NO Valido" }, new FaultReason("DNI NO Valido"));
            }

            if (canConvert1 != true || canConvert2 != true || canConvert3 != true || canConvert4 != true || canConvert5 != true || canConvert6 != true || canConvert7 != true || canConvert8 != true || canConvert9 != true )
            {
                throw new FaultException<ValidationException>(new ValidationException { ValidationError = "Debe ingresar un monto Correcto" }, new FaultReason("Debe ingresar un monto Correcto"));
            }




            Autorizacion autorizacionACrear = new Autorizacion()
            {
                
                CodSol = codsol,//usuarioExistente.Codigo,
                CodArea = codarea,
                CodEmpGe = codsolge,
                CentroCos = ccost,
                AUDNI= dni,
                PerViajan = perviajan,
                Ruta = ruta,
                FechaDes = fdes,
                FechaHas = fhas,
                Motivo = motivo,
                Moneda = moneda,
                Hotel = hotel,
                Viaticos = viaticos,
                Movilidad = movi,
                Telefono = tele,
                Gastos = gasto,
                IMPAereo = impaereo,
                Pasaje = pasaje,
                Combustible = combus,
                Otros = otros,
                Status = "PENDIENTE"
            };

            return AutorizacionDAO.Crear(autorizacionACrear);
        }

        public Autorizacion ModificarAutorizacion(int codigo, int codsol, int codarea, string codsolge, string ccost, string dni, int perviajan, string ruta, string fdes, string fhas, string motivo, string moneda, double hotel, double viaticos, double movi, double tele, double gasto, double impaereo, double pasaje, double combus, double otros, string status)
        {
            //Usuario usuarioExistente = UsuarioDAO.Obtener(codsol); ;
            Autorizacion autorizacionAModificar = new Autorizacion()
            {
                CodigoAU = codigo,
                CodSol = codsol,//usuarioExistente.Codigo,
                CodArea = codarea,
                CodEmpGe = codsolge,
                CentroCos = ccost,
                AUDNI = dni,
                PerViajan = perviajan,
                Ruta = ruta,
                FechaDes = fdes,
                FechaHas = fhas,
                Motivo = motivo,
                Moneda = moneda,
                Hotel = hotel,
                Viaticos = viaticos,
                Movilidad = movi,
                Telefono = tele,
                Gastos = gasto,
                IMPAereo = impaereo,
                Pasaje = pasaje,
                Combustible = combus,
                Otros = otros,
                Status = status
            };
            return AutorizacionDAO.Modificar(autorizacionAModificar);
        }

        public void EliminarAutorizacion(int codigo)
        {
            Autorizacion autorizacionExistente = AutorizacionDAO.Obtener(codigo);
            AutorizacionDAO.Eliminar(autorizacionExistente);
        }

        public List<Autorizacion> ListarAutorizaciones()
        {
            return AutorizacionDAO.ListarTodos().ToList();
        }
    }
}
